﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Marmat.Forms.Skin
{
    partial class TreeView
    {
        /// <summary>
        /// 禁用任何树视图重绘。
        /// </summary>
        public void BeginUpdate()
        {
            beginUpdate = true;
        }

        /// <summary>
        /// 折叠所有树节点。
        /// </summary>
        public void CollapseAll()
        {
            foreach (TreeNode node in this.Nodes)
            {
                node.Collapse(false);
            }
        }

        /// <summary>
        /// 启用树视图的重绘。
        /// </summary>
        public void EndUpdate()
        {
            beginUpdate = false;
        }

        /// <summary>
        /// 展开所有树节点。
        /// </summary>
        public void ExpandAll()
        {
            foreach (TreeNode node in this.Nodes)
            {
                node.ExpandAll();
            }
        }

        /// <summary>
        /// 检索位于指定点的树节点。
        /// </summary>
        /// <param name="pt">System.Drawing.Point 计算和检索的节点。</param>
        /// <returns>System.Windows.Forms.TreeNode 树视图 （客户端） 坐标中的指定点处或 null 如果在该位置没有节点。</returns>
        public TreeNode GetNodeAt(Point pt)
        {
            return GetNodeAt(this.Nodes);
            TreeNode GetNodeAt(TreeNodeCollection nodeCollection)
            {
                foreach (TreeNode node in nodeCollection)
                {
                    if (node.Bounds.Contains(pt))
                        return node;
                    if (node.Nodes.Count > 0)
                        return GetNodeAt(node.Nodes);
                }
                return null;
            }
        }

        /// <summary>
        /// 检索位于指定点（以坐标表示）的树节点。
        /// </summary>
        /// <param name="x">System.Drawing.Point.X 计算和检索的节点的位置。</param>
        /// <param name="y">System.Drawing.Point.Y 计算和检索的节点的位置。</param>
        /// <returns>System.Windows.Forms.TreeNode 中指定的位置，在树视图 （客户端） 坐标中，或 null 如果在该位置没有节点。</returns>
        public TreeNode GetNodeAt(int x, int y)
        {
            return this.GetNodeAt(new Point(x, y));
        }

        /// <summary>
        /// 检索分配给树视图控件的树节点数（可以选择性地包括所有子树中的树节点）。
        /// </summary>
        /// <param name="includeSubTrees">true 若要进行计数 System.Windows.Forms.TreeNode 项包含子树; 否则为 false。</param>
        /// <returns>分配给树视图控件的树节点数（可以选择性地包括所有子树中的树节点）。</returns>
        public int GetNodeCount(bool includeSubTrees)
        {
            if (!includeSubTrees)
                return this.Nodes.Count;
            else
                return GetNodeCount(this.Nodes);
            int GetNodeCount(TreeNodeCollection nodeCollection)
            {
                int count = 0;
                foreach (TreeNode node in nodeCollection)
                {
                    count++;
                    if (node.Nodes.Count > 0)
                        count += GetNodeCount(node.Nodes);
                }
                return count;
            }
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.AfterCheck 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeViewEventArgs。</param>
        protected virtual void OnAfterCheck(TreeViewEventArgs e)
        {
            this.AfterCheck?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.AfterExpand 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeViewEventArgs。</param>
        protected virtual void OnAfterExpand(TreeViewEventArgs e)
        {
            this.AfterExpand?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.AfterSelect 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeViewEventArgs。</param>
        protected virtual void OnAfterSelect(TreeViewEventArgs e)
        {
            this.AfterSelect?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.BeforeCheck 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeViewCancelEventArgs。</param>
        protected virtual void OnBeforeCheck(TreeViewCancelEventArgs e)
        {
            this.BeforeCheck?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.BeforeExpand 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeViewCancelEventArgs。</param>
        protected virtual void OnBeforeExpand(TreeViewCancelEventArgs e)
        {
            this.BeforeExpand?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.BeforeSelect 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeViewCancelEventArgs。</param>
        protected virtual void OnBeforeSelect(TreeViewCancelEventArgs e)
        {
            this.BeforeSelect?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.DrawNode 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.DrawTreeNodeEventArgs。</param>
        protected virtual void OnDrawNode(DrawTreeNodeEventArgs e)
        {
            this.DrawNode?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.MeasureNode 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.DrawTreeNodeEventArgs。</param>
        protected virtual void OnMeasureNode(MeasureTreeNodeEventArgs e)
        {
            this.MeasureNode?.Invoke(this, e);
        }

        ///// <summary>
        ///// 引发 System.Windows.Forms.TreeView.ItemDrag 事件。
        ///// </summary>
        ///// <param name="e">包含事件数据的 System.Windows.Forms.ItemDragEventArgs。</param>
        //protected virtual void OnItemDrag(ItemDragEventArgs e)
        //{
        //}

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.NodeMouseClick 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeNodeMouseClickEventArgs。</param>
        protected virtual void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
        {
            this.NodeMouseClick?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.NodeMouseDoubleClick 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeNodeMouseClickEventArgs。</param>
        protected virtual void OnNodeMouseDoubleClick(TreeNodeMouseClickEventArgs e)
        {
            this.NodeMouseDoubleClick?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.NodeMouseHover 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeNodeMouseHoverEventArgs。</param>
        protected virtual void OnNodeMouseHover(TreeNodeMouseHoverEventArgs e)
        {
            this.NodeMouseHover?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.AfterCollapse 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeViewEventArgs。</param>
        protected internal virtual void OnAfterCollapse(TreeViewEventArgs e)
        {
            this.AfterCollapse?.Invoke(this, e);
        }

        /// <summary>
        /// 引发 System.Windows.Forms.TreeView.BeforeCollapse 事件。
        /// </summary>
        /// <param name="e">包含事件数据的 System.Windows.Forms.TreeViewCancelEventArgs。</param>
        protected internal virtual void OnBeforeCollapse(TreeViewCancelEventArgs e)
        {
            this.BeforeCollapse?.Invoke(this, e);
        }
    }
}
